import path from 'path';

function getModulePackageName(module) {
    if (!module.context) return null;
    const nodeModulesPath = path.join(__dirname, '../node_modules/');

    if (module.context.substring(0, nodeModulesPath.length) !== nodeModulesPath) {
        return null;
    }

    const moduleRelativePath = module.context.substring(nodeModulesPath.length);
    const [moduleDirName] = moduleRelativePath.split(path.sep);
    let packageName = moduleDirName; // handle tree shaking

    if (packageName && packageName.match('^_')) {
        // eslint-disable-next-line prefer-destructuring
        packageName = packageName.match(/^_(@?[^@]+)/)[1];
    }

    return packageName;
}

export const webpackPlugin = config => {
    // optimize chunks
    config.optimization // share the same chunks across different modules
        .runtimeChunk(false)
        .splitChunks({
            chunks: 'async',
            name: 'vendors',
            maxInitialRequests: Infinity,
            minSize: 0,
            cacheGroups: {
                vendors: {
                    test: module => {
                        const packageName = getModulePackageName(module) || '';

                        if (packageName) {
                            return [
                                'bizcharts',
                                'gg-editor',
                                'g6',
                                '@antv',
                                'gg-editor-core',
                                'bizcharts-plugin-slider',
                            ].includes(packageName);
                        }

                        return false;
                    },

                    name(module) {
                        const packageName = getModulePackageName(module);

                        if (packageName) {
                            if (['bizcharts', '@antv_data-set'].indexOf(packageName) >= 0) {
                                return 'viz'; // visualization package
                            }
                        }

                        return 'misc';
                    },
                },
            },
        });
};
